package com.limit.annotation;


import com.limit.enums.RateLimitStrategyEnum;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 令牌桶限流
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Inherited
@Documented
public @interface TokenBucketLimit {

    /**
     * 令牌桶最大容量
     */
    long bucketCapacity() default 30L;

    /**
     * 限流周期
     * 令牌桶最大容量 / 限流周期 = 令牌生成的频率
     * (默认30/10 = 3个/秒)
     *
     * @return 时间周期 单位为s
     */
    int period() default 10;

    /**
     * 每次请求消耗令牌的数量
     */
    int consumptionPerRequest() default 1;

    /**
     * 限流策略，默认为方法策略
     * <p>方法策略-> key为：rateLimit:METHOD_NAME:IP</p>
     * IP策略-> key为：rateLimit:IP
     *
     * @return RateLimitStrategyEnum 限流策略枚举
     */
    RateLimitStrategyEnum[] strategy() default RateLimitStrategyEnum.METHOD;


}
